#include <mips/regdef.h>
#include <sys/syscall.h>

	.text
	.align 	2
	.global main
	.ent 	main

main:
	.frame	$fp, 56, ra

	.set noreorder
	.cpload	t9
	.set reorder

	subu	sp,sp,56

	# Guardo los registros
	.cprestore 40
	sw		ra,48(sp)
	sw		$fp,44(sp)
	move	$fp,sp

	sw		zero, 20($fp)	// tamanio del buffer
	
	# malloc del buffer lectura
	li		a0,	2
	jal 	mymalloc
	sw      v0, 16($fp) // buffer resultado right
	
	# malloc del buffer lectura
	li		a0,	1
	jal 	mymalloc
	sw      v0, 24($fp) // buffer auxiliar


while_loop:

	# Leo de STDIN
	li		v0,	SYS_read
	li		a0,	0
	lw		a1,	16($fp)	// buffer lectura
	li		a2,	1		// leo un byte
	syscall

	sw		v0, 32($fp)
	
	lw		t1, 32($fp)
	beq		t1, zero, fin_archivo

	# malloc del buffer auxiliar
	lw		a0,	20($fp)
	addiu	a0, a0, 1
	jal 	mymalloc
	sw      v0, 28($fp) // buffer auxiliar
	
	# copio los ultimos n chars del string de input a right
	li		t1, 0
	lw		t2, 24($fp) // ptr a buffer origen
	lw		t3, 28($fp) // ptr a buffer destino
	lw		t4,	20($fp) // length del origen

loop_copia:
	bgt	t1, t4, fin_copiado
	lb	t6,	0(t2)
	sb	t6, 0(t3)
	addiu	t1, t1, 1 // i++
	addiu	t2, t2, 1
	addiu	t3, t3, 1	
	j 	loop_copia

fin_copiado:
	# append del nuevo caracter leido
	lw		t4,	20($fp)
	lw		t5,	28($fp)
	add		t5, t5, t4
	lw		t2, 16($fp)
	lb		t3, 0(t2)	// caracter
	sb		t3,	0(t5)	// append
	addiu	t4, t4, 1	// aumento la longitud
	sw		t4,	20($fp)
	
	# free del buffer origen
	lw		a0,	24($fp)
	jal 	myfree
	
	# intercambio los punteros
	lw		t3, 28($fp)
	sw		t3, 24($fp)
	
	j 	while_loop

fin_archivo:
	
	################
	lw		a0, 24($fp)
	jal	length
	sw      v0, 32($fp)

	li	v0, SYS_write 
	li	a0, 1
	lw	a1, 24($fp)
	lw	a2, 32($fp)
	syscall	
	################
	
	# malloc del buffer resultado
	lw		a0,	20($fp)
	jal 	mymalloc
	sw      v0, 36($fp) // buffer resultado
	
	# llamo a mergesort.
#	lw	a0, 24($fp)		// input
#	lw	a1, 36($fp)		// resultado
#	jal	mergesort
	
	# free del buffer resultado
	lw		a0,	36($fp)
	jal 	myfree		
	
	# free del buffer auxiliar
	lw		a0,	24($fp)
	jal 	myfree
	
	# free del buffer de lectura
	lw		a0,	16($fp)
	jal 	myfree	
	
main_return:
	# destruyo el stack
	move	sp, $fp
	lw	$fp, 44(sp)
	lw	ra,  48(sp)
	addu	sp, sp, 56

	j	ra
	.end	main
	
	.rdata
str_hola: .asciiz	"hola\n"
str_while: .asciiz	"whileeee\n"
